package com.zhu.instructions.math;

// instructions/math/ISHL.java
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.OperandStack;

/**
 * 指令：ishl
 *
 * 操作数：无
 *
 * 功能：
 *  将栈顶的两个 int 值进行左移操作：value1 << value2
 *
 * 栈变化：
 *      ..., value1, value2 → ..., result
 *
 * 注意：
 *  - value2 只取低 5 位（& 0x1f），因为 int 是 32 位
 *  - 即使 value2 >= 32，也不会出错，而是取模 32
 *  - 例如：8 << 35 等价于 8 << 3 = 64
 */
public class ISHL extends NoOperandsInstruction {
    @Override
    public void execute(Frame frame) {
        OperandStack stack = frame.getOperandStack();
        int v2 = stack.popInt(); // 位移量（int）
        int v1 = stack.popInt(); // 被移动值

        int s = v2 & 0x1f; // 只取低5位（0~31）
        int result = v1 << s;
        stack.pushInt(result);
    }
}
